<?php

m2import('phpinchains/psp/Tag.php');
m2import('phpinchains/tagsupport/URL.php');

class cms_diggstylepaginatorHandler extends phpinchains_psp_Tag
{

    /**
     * Is a body tag (if false, body is ignored)
     */
    var $tagType = PSP_EMPTY_TAG;
    /**
     * Tag name in form namespace:tagname
     */
    var $tagName   = 'cms:diggstylepaginator';
	var $requiredAttributes = array(
		'name' => '[\w\d_]+',
		'perPage' => '\d+',
		'numResults' => '\d*',
		'length' => '\d+'
	);
	var $attributes = array(
		'name',
		'perPage',
		'numResults',
		'length'
	);
	var $env;
	
	//function to return the pagination string
	function getPaginationString($page = 1, $totalitems, $limit = 15, $adjacents = 1, $targetpage = "/", $pagestring = "?page=")
	{		
		//defaults
		if(!$adjacents) $adjacents = 1;
		if(!$limit) $limit = 15;
		if(!$page) $page = 1;
		if(!$targetpage) $targetpage = "/";
	
		$nameParam = '&'.$this->getAttribute('name').'=';
		//other vars
		$prev = $page - 1;									//previous page is page - 1
		$next = $page + 1;									//next page is page + 1
		$lastpage = ceil($totalitems / $limit);				//lastpage is = total items / items per page, rounded up.
		$lpm1 = $lastpage - 1;								//last page minus 1
		
		/* 
			Now we apply our rules and draw the pagination object. 
			We're actually saving the code to a variable in case we want to draw it more than once.
		*/
		$pagination = "";
		if($lastpage > 1)
		{	
			$pagination .= "<div class=\"pagination\"";
			if($margin || $padding)
			{
				$pagination .= " style=\"";
				if($margin)
					$pagination .= "margin: $margin;";
				if($padding)
					$pagination .= "padding: $padding;";
				$pagination .= "\"";
			}
			$pagination .= ">";
	
			//previous button
			if ($page > 1) 
				$pagination .= "<a href=\"$targetpage$pagestring$prev$nameParam".($prev*$limit-$limit)."\">&#171; prev</a>";
			else
				$pagination .= "<span class=\"disabled\">&#171; prev</span>";	
		
			//pages	
			if ($lastpage < 7 + ($adjacents * 2))	//not enough pages to bother breaking it up
			{	
				for ($counter = 1; $counter <= $lastpage; $counter++)
				{
					if ($counter == $page)
						$pagination .= "<span class=\"current\">$counter</span>";
					else
						$pagination .= "<a href=\"$targetpage$pagestring$counter$nameParam".($counter*$limit-$limit)."\">$counter</a>";					
				}
			}
			elseif($lastpage >= 7 + ($adjacents * 2))	//enough pages to hide some
			{
				//close to beginning; only hide later pages
				if($page < 1 + ($adjacents * 3))		
				{
					for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
					{
						if ($counter == $page)
							$pagination .= "<span class=\"current\">$counter</span>";
						else
							$pagination .= "<a href=\"$targetpage$pagestring$counter$nameParam".($couter*$limit-$limit)."\">$counter</a>";					
					}
					$pagination .= "...";
					$pagination .= "<a href=\"$targetpage$pagestring$lpm1$nameParam".($lpm1*$limit-$limit)."\">$lpm1</a>";
					$pagination .= "<a href=\"$targetpage$pagestring$lastpage$nameParam".($lastpage*$limit-$limit)."\">$lastpage</a>";		
				}
				//in middle; hide some front and some back
				elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
				{
					$pagination .= "<a href=\"$targetpage$pagestring1$nameParam".(0)."\">1</a>";
					$pagination .= "<a href=\"$targetpage$pagestring2$nameParam$limit\">2</a>";
					$pagination .= "...";
					for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
					{
						if ($counter == $page)
							$pagination .= "<span class=\"current\">$counter</span>";
						else
							$pagination .= "<a href=\"$targetpage$pagestring$counter$nameParam".($counter*$limit-$limit)."\">$counter</a>";					
					}
					$pagination .= "...";
					$pagination .= "<a href=\"$targetpage$pagestring$lpm1$nameParam".($lpm1*$limit-$limit)."\">$lpm1</a>";
					$pagination .= "<a href=\"$targetpage$pagestring$lastpage$nameParam".($lastpage*$limit-$limit)."\">$lastpage</a>";		
				}
				//close to end; only hide early pages
				else
				{
					$pagination .= "<a href=\"$targetpage$pagestring1$nameParam".(0)."\">1</a>";
					$pagination .= "<a href=\"$targetpage$pagestring2$nameParam$limit\">2</a>";
					$pagination .= "...";
					for ($counter = $lastpage - (1 + ($adjacents * 3)); $counter <= $lastpage; $counter++)
					{
						if ($counter == $page)
							$pagination .= "<span class=\"current\">$counter</span>";
						else
							$pagination .= "<a href=\"$targetpage$pagestring$counter$nameParam".($counter*$limit-$limit)."\">$counter</a>";					
					}
				}
			}
			
			//next button
			if ($page < $counter - 1) 
				$pagination .= "<a href=\"$targetpage$pagestring$next$nameParam".($next*$limit-$limit)."\">next &#187;</a>";
			else
				$pagination .= "<span class=\"disabled\">next &#187;</span>";
			$pagination .= "</div>\n";
		}
		return $pagination;
	}

	function param($name)
	{
		return $this->actionform->get($name) ? $this->actionform->get($name) : $this->env->param($name);
	}
	
    function doStartTag()
    {
    	$ctx = & phpinchains_ApplicationContext::getInstance();
    	$this->env = & $ctx->getEnv();
    	$name = $this->getAttribute('name');
    	$perPage = (int) $this->getAttribute('perPage');
    	$componentValue = $this->actionform->get($name) ? $this->actionform->get($name) : $this->env->param($name);
		$page  = ((int) $componentValue / $perPage + 1);
		$pages = ceil((int) $this->getAttribute('numResults') / $perPage);
    	$str = $this->getPaginationString($this->param('page'), $pages, $perPage, 2, "?doc_id=".$GLOBALS['doc_id'], "&page=");
		$this->out->write($str);
    	return PSP_SKIP_BODY;
    }
    
}
?>